package com.lsiyun.sync_file.protocol;

import cn.hutool.crypto.SecureUtil;
import lombok.Data;

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

@Data
public class SyncFile implements Serializable {
    private String fileName;
    /**
     * 相对同步文件的相对路劲
     */
    private String path;
    private Long updateTime;
    private String md5;
    private boolean isDir;
    private boolean isFile;

    private List<SyncFile> files = new ArrayList<>();

    public SyncFile(String syncDir, String path) {
        File file = new File(syncDir, path);
        this.path = path;
        this.fileName = file.getName();
        if (file.exists()) {
            isFile = file.isFile();
            isDir = file.isDirectory();
            updateTime = calcUpdateTime(file);

            if (file.isFile()) {
                md5 = SecureUtil.md5(file);
            }


            // 添加子目录的文件
            if (file.isDirectory()) {
                File[] subFiles = file.listFiles();
                for (File subFile : subFiles) {
                    SyncFile syncFile = new SyncFile(syncDir, path + "/" + subFile.getName());
                    files.add(syncFile);
                }
            }
        }
    }

    private Long calcUpdateTime(File file) {
        if (file.isFile()) {
            return file.lastModified();
        } else {
            // 目录下所有文件最新的修改时间为目录修改时间
            File[] files = file.listFiles();
            if (files != null && files.length > 0) {
                long last = 0;
                for (File f : files) {
                    long t = calcUpdateTime(f);
                    if (t > last) {
                        last = t;
                    }
                }
                return last;
            } else {
                return file.lastModified();
            }
        }
    }
}
